/**
 * @description 时间验证
 * @author 张航
 * @date 2020-04-14 11:35:47
 * @version V1.0.0
 */

// 导入工具包
import tools from '@/tools'

/**
 * @functionName dateCompare
 * @param {String|Number|Date} date 被检测的数据
 * @param {Number} type 比较类型,1:比当前时间早;2:比当前时间晚;
 * @return {Object} 返回检测结果
 * @description 被检测时间与当前时间比较
 * @author 张航
 * @date 2020-04-14 08:59:58
 * @version V1.0.0
 */
export const dateCompare = (date = new Date(), type = 0) => {
  // 初始化返回参数
  const resultObj = tools.resultObj(
    { date, type },
    false,
    `参数"${date}"类型不正确,请传入[Date]、[String]或[Number]类型！`
  )

  // 获取数据类型
  const datatype = tools.getRawType(date)
  if (datatype !== 'Date' && datatype !== 'String' && datatype !== 'Number') {
    return resultObj
  }

  // 处理检测类型错误
  if (type !== 0 && type !== 1) {
    resultObj.message = `参数"${type}"不正确,可选值为[0]或[1]！`
    return resultObj
  }

  // 被检测数据的时间戳
  const timeStamp = tools.getTimeStamp(date)

  // 根据类型比较时间
  if (type === 0) {
    return earlier(timeStamp, resultObj)
  }
  if (type === 1) {
    return later(timeStamp, resultObj)
  }

  return resultObj
}

/**
 * @functionName earlier
 * @param {Number} timeStamp 被检测的时间戳
 * @param {Object} resultObj 结果对象
 * @return {Object} 返回结果
 * @description 内部方法，检测时间戳是否比当前时间早
 * @author 张航
 * @date 2020-04-14 09:02:44
 * @version V1.0.0
 */
const earlier = (timeStamp, resultObj) => {
  const now = tools.getTimeStamp()
  if (timeStamp < now) {
    resultObj.result = true
    resultObj.message = '检测时间比当前时间早。'
    return resultObj
  }
  resultObj.message = '检测时间比当前时间晚。'
  return resultObj
}

/**
 * @functionName later
 * @param {Number} timeStamp 被检测的时间戳
 * @param {Object} resultObj 结果对象
 * @return {Object} 返回结果
 * @description 内部方法，检测时间戳是否比当前时间晚
 * @author 张航
 * @date 2020-04-14 09:32:08
 * @version V1.0.0
 */
const later = (timeStamp, resultObj) => {
  const now = tools.getTimeStamp()
  if (timeStamp > now) {
    resultObj.result = true
    resultObj.message = '检测时间比当前时间晚。'
    return resultObj
  }
  resultObj.message = '检测时间比当前时间早。'
  return resultObj
}

/**
 * @functionName firstDateEarlier
 * @param {String|Number|Date} date1 时间1
 * @param {String|Number|Date} date2 时间2
 * @return {Object} 返回结果
 * @description 检测第一个时间是否比第二个时间早
 * @author 张航
 * @date 2020-04-14 09:34:51
 * @version V1.0.0
 */
export const firstDateEarlier = (date1 = new Date(), date2 = new Date()) => {
  // 初始化返回参数
  const resultObj = tools.resultObj(
    { date1, date2 },
    false,
    `时间[${date1}]比时间[${date2}]晚。`
  )

  // 获取数据类型
  const data1type = tools.getRawType(date1)
  if (data1type !== 'Date' && data1type !== 'String' && data1type !== 'Number') {
    resultObj.message = `参数"${date1}"类型不正确,请传入[Date]、[String]或[Number]类型！`
    return resultObj
  }

  const data2type = tools.getRawType(date2)
  if (data2type !== 'Date' && data2type !== 'String' && data2type !== 'Number') {
    resultObj.message = `参数"${date2}"类型不正确,请传入[Date]、[String]或[Number]类型！`
    return resultObj
  }

  // 被检测数据的时间戳
  const timeStamp1 = tools.getTimeStamp(date1)
  const timeStamp2 = tools.getTimeStamp(date2)

  if (timeStamp1 === timeStamp2) {
    resultObj.message = `时间[${date1}]和时间[${date2}]相同。`
    return resultObj
  }

  if (timeStamp1 < timeStamp2) {
    resultObj.result = true
    resultObj.message = `时间[${date1}]比时间[${date1}]早。`
    return resultObj
  }

  return resultObj
}
